package pe.com.bn.sach.dao.impl;

import java.util.List;
import com.ibatis.sqlmap.client.SqlMapClient;

import java.sql.SQLException;
import pe.com.bn.sach.dao.ArchivoFisicoDAO;
import pe.com.bn.sach.domain.Bnchf15ArchivoFisico;
import pe.com.bn.sach.seguridad.DatosSesion;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;



import org.springframework.jdbc.core.support.AbstractLobCreatingPreparedStatementCallback;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.lob.LobHandler;
import org.springframework.jdbc.core.support.AbstractLobStreamingResultSetExtractor;
import org.springframework.jdbc.support.lob.LobCreator;
import org.springframework.jdbc.LobRetrievalFailureException;
import org.springframework.util.FileCopyUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


public class ArchivoFisicoImpl extends JdbcDaoSupport  implements ArchivoFisicoDAO
{
	protected final Log logger = LogFactory.getLog(getClass());
	protected SqlMapClient sqlMap = null;
	public void setSqlMap(SqlMapClient sqlMap) {
		this.sqlMap = sqlMap;
	}
	private LobHandler lobHandler;
	protected int idarchivo;
	
		
		


	
	public List listaArchivoFisico(Bnchf15ArchivoFisico bnchf15ArchivoFisico) throws Exception{
	
		return sqlMap.queryForList("sqlArchivoFisico.listaArchivoFisico",bnchf15ArchivoFisico);
	}
	
	

		public void setLobHandler(LobHandler lobHandler) {
		this.lobHandler = lobHandler;
	}
		
		public int MAXARCHIVO() throws Exception{    
	        try {
	        	
	        	String id = (String)sqlMap.queryForObject("sqlArchivoFisico.MaxArchivo");
	             return Integer.parseInt(id);
	        } catch (Exception e) {
	            throw new Exception("Error MAXARCHIVO: " + e);
	        }
	    }
	
	

		public void streamDoc(final String idDocumento,final String idArchivo, final OutputStream contentStream) throws Exception {
			
			getJdbcTemplate().query(
					" SELECT F15_CONTEN_DOC FROM BN_SACH.BNCHF15_ARCHIVO_FISICO where F15_ID_DOCUMENTO = "+idDocumento+" and F15_ID_ARCHIVO = "+idArchivo+" ",
					new AbstractLobStreamingResultSetExtractor() {
						protected void handleNoRowFound() throws LobRetrievalFailureException {
					
							throw new EmptyResultDataAccessException(
							    "Image with name  not found in database", 1);
						}
						public void streamData(ResultSet rs) throws SQLException, IOException {
							InputStream is = lobHandler.getBlobAsBinaryStream(rs, 1);
							if (is != null) {
								FileCopyUtils.copy(is, contentStream);
							}
						}
					}
			);
			
		}
		
		
public void storeDoc(final String name, final InputStream contentStream, final int contentLength,
		final int idDocumento,final int UsuarioAct,final int UsuarioCrea,final String NombreDoc,final String DescDoc
)
	   {
	
	
	java.util.Date utilDate = new java.util.Date(); //fecha actual
	  long lnMilisegundos = utilDate.getTime();
	  final java.sql.Date sqlDate = new java.sql.Date(lnMilisegundos);

	  
	 try {
		idarchivo = this.MAXARCHIVO();
	} catch (Exception e1) {
		
		e1.printStackTrace();
	}
	
	
	try{
	
		getJdbcTemplate().execute(
					"INSERT INTO BN_SACH.BNCHF15_ARCHIVO_FISICO (F15_ID_DOCUMENTO,F15_ID_ARCHIVO,F15_USR_ACT,F15_ID_USUA_CREA,F15_FE_USUA_CREA,F15_USR_REG,F15_FE_USR_REG,F15_NOMB_DOC,F15_DESC_DOC,F15_CONTEN_DOC,F15_STDO_DOC)" +
					" VALUES (?,?,?,?,?,?,?,?,?,?,1)",
				new AbstractLobCreatingPreparedStatementCallback(this.lobHandler) {
					protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException {
				

						
						ps.setInt(1,idDocumento);
						ps.setInt(2,idarchivo);
						ps.setInt(3,UsuarioAct);
						ps.setInt(4,UsuarioCrea);
						ps.setDate(5,sqlDate);
						ps.setInt(6,UsuarioCrea);
						ps.setDate(7,sqlDate);
						ps.setString(8,NombreDoc);
						ps.setString(9,DescDoc);
						lobCreator.setBlobAsBinaryStream(ps, 10, contentStream, contentLength);
					}
				}
		);
		
	
	   }catch(Exception  e)
	   {
	   	e.printStackTrace();
	   }
	   
	   }

public String[] guardarDoc(final String idDoc, final String name, final String archivoNombre,final String descripcion, final InputStream contentStream, final int contentLength, final DatosSesion datosSesion)
{

java.util.Date utilDate = new java.util.Date(); //fecha actual
long lnMilisegundos = utilDate.getTime();
final java.sql.Date sqlDate = new java.sql.Date(lnMilisegundos);


	try {
		idarchivo = this.MAXARCHIVO();
	} catch (Exception e1) {
		e1.printStackTrace();
		return new String[]{"Error al generar ID del documento", e1.toString() };
	}
	
	
	try{
	
		
		getJdbcTemplate().execute(
					"INSERT INTO BN_SACH.BNCHF15_ARCHIVO_FISICO (F15_ID_DOCUMENTO,F15_ID_ARCHIVO,F15_USR_REG,F15_fe_usr_reg,F15_ID_USUA_CREA,F15_FE_USUA_CREA,F15_NOMB_DOC,F15_DESC_DOC,F15_CONTEN_DOC,F15_STDO_DOC)" +
					" VALUES (?, ?, ?,?, ?, ?, ?, ?, ?, 1)",
				new AbstractLobCreatingPreparedStatementCallback(this.lobHandler) {
					protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException {
						ps.setInt(1,Integer.parseInt(idDoc));
						ps.setInt(2,idarchivo);
						ps.setInt(3,Integer.parseInt(datosSesion.getCodigoUsuario()));
						ps.setDate(4,sqlDate);
						ps.setString(5,datosSesion.getCodigoHost());
						ps.setDate(6,sqlDate);
						ps.setString(7, archivoNombre);
						ps.setString(8, descripcion);
						lobCreator.setBlobAsBinaryStream(ps, 9, contentStream, contentLength);
					}
				}
		);
	
	
	}catch(DataAccessException ex)
	{
		ex.printStackTrace();
		return new String[]{"Error al subir archivo al servidor", null };
	}

	return null;
}





}
